{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "from sklearn.linear_model import LinearRegression, SGDRegressor,Ridge,Lasso,LogisticRegression\n",
    "from sklearn.model_selection import train_test_split\n",
    "from sklearn.preprocessing import StandardScaler\n",
    "from sklearn.metrics import mean_squared_error\n",
    "import pandas as pd\n",
    "import numpy as np"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "outputs": [
    {
     "ename": "URLError",
     "evalue": "<urlopen error [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: Hostname mismatch, certificate is not valid for 'archive.ics.uci.edu'. (_ssl.c:1108)>",
     "output_type": "error",
     "traceback": [
      "\u001B[1;31m---------------------------------------------------------------------------\u001B[0m",
      "\u001B[1;31mSSLCertVerificationError\u001B[0m                  Traceback (most recent call last)",
      "File \u001B[1;32mF:\\python38\\lib\\urllib\\request.py:1317\u001B[0m, in \u001B[0;36mAbstractHTTPHandler.do_open\u001B[1;34m(self, http_class, req, **http_conn_args)\u001B[0m\n\u001B[0;32m   1316\u001B[0m \u001B[38;5;28;01mtry\u001B[39;00m:\n\u001B[1;32m-> 1317\u001B[0m     \u001B[43mh\u001B[49m\u001B[38;5;241;43m.\u001B[39;49m\u001B[43mrequest\u001B[49m\u001B[43m(\u001B[49m\u001B[43mreq\u001B[49m\u001B[38;5;241;43m.\u001B[39;49m\u001B[43mget_method\u001B[49m\u001B[43m(\u001B[49m\u001B[43m)\u001B[49m\u001B[43m,\u001B[49m\u001B[43m \u001B[49m\u001B[43mreq\u001B[49m\u001B[38;5;241;43m.\u001B[39;49m\u001B[43mselector\u001B[49m\u001B[43m,\u001B[49m\u001B[43m \u001B[49m\u001B[43mreq\u001B[49m\u001B[38;5;241;43m.\u001B[39;49m\u001B[43mdata\u001B[49m\u001B[43m,\u001B[49m\u001B[43m \u001B[49m\u001B[43mheaders\u001B[49m\u001B[43m,\u001B[49m\n\u001B[0;32m   1318\u001B[0m \u001B[43m              \u001B[49m\u001B[43mencode_chunked\u001B[49m\u001B[38;5;241;43m=\u001B[39;49m\u001B[43mreq\u001B[49m\u001B[38;5;241;43m.\u001B[39;49m\u001B[43mhas_header\u001B[49m\u001B[43m(\u001B[49m\u001B[38;5;124;43m'\u001B[39;49m\u001B[38;5;124;43mTransfer-encoding\u001B[39;49m\u001B[38;5;124;43m'\u001B[39;49m\u001B[43m)\u001B[49m\u001B[43m)\u001B[49m\n\u001B[0;32m   1319\u001B[0m \u001B[38;5;28;01mexcept\u001B[39;00m \u001B[38;5;167;01mOSError\u001B[39;00m \u001B[38;5;28;01mas\u001B[39;00m err: \u001B[38;5;66;03m# timeout error\u001B[39;00m\n",
      "File \u001B[1;32mF:\\python38\\lib\\http\\client.py:1230\u001B[0m, in \u001B[0;36mHTTPConnection.request\u001B[1;34m(self, method, url, body, headers, encode_chunked)\u001B[0m\n\u001B[0;32m   1229\u001B[0m \u001B[38;5;250m\u001B[39m\u001B[38;5;124;03m\"\"\"Send a complete request to the server.\"\"\"\u001B[39;00m\n\u001B[1;32m-> 1230\u001B[0m \u001B[38;5;28;43mself\u001B[39;49m\u001B[38;5;241;43m.\u001B[39;49m\u001B[43m_send_request\u001B[49m\u001B[43m(\u001B[49m\u001B[43mmethod\u001B[49m\u001B[43m,\u001B[49m\u001B[43m \u001B[49m\u001B[43murl\u001B[49m\u001B[43m,\u001B[49m\u001B[43m \u001B[49m\u001B[43mbody\u001B[49m\u001B[43m,\u001B[49m\u001B[43m \u001B[49m\u001B[43mheaders\u001B[49m\u001B[43m,\u001B[49m\u001B[43m \u001B[49m\u001B[43mencode_chunked\u001B[49m\u001B[43m)\u001B[49m\n",
      "File \u001B[1;32mF:\\python38\\lib\\http\\client.py:1276\u001B[0m, in \u001B[0;36mHTTPConnection._send_request\u001B[1;34m(self, method, url, body, headers, encode_chunked)\u001B[0m\n\u001B[0;32m   1275\u001B[0m     body \u001B[38;5;241m=\u001B[39m _encode(body, \u001B[38;5;124m'\u001B[39m\u001B[38;5;124mbody\u001B[39m\u001B[38;5;124m'\u001B[39m)\n\u001B[1;32m-> 1276\u001B[0m \u001B[38;5;28;43mself\u001B[39;49m\u001B[38;5;241;43m.\u001B[39;49m\u001B[43mendheaders\u001B[49m\u001B[43m(\u001B[49m\u001B[43mbody\u001B[49m\u001B[43m,\u001B[49m\u001B[43m \u001B[49m\u001B[43mencode_chunked\u001B[49m\u001B[38;5;241;43m=\u001B[39;49m\u001B[43mencode_chunked\u001B[49m\u001B[43m)\u001B[49m\n",
      "File \u001B[1;32mF:\\python38\\lib\\http\\client.py:1225\u001B[0m, in \u001B[0;36mHTTPConnection.endheaders\u001B[1;34m(self, message_body, encode_chunked)\u001B[0m\n\u001B[0;32m   1224\u001B[0m     \u001B[38;5;28;01mraise\u001B[39;00m CannotSendHeader()\n\u001B[1;32m-> 1225\u001B[0m \u001B[38;5;28;43mself\u001B[39;49m\u001B[38;5;241;43m.\u001B[39;49m\u001B[43m_send_output\u001B[49m\u001B[43m(\u001B[49m\u001B[43mmessage_body\u001B[49m\u001B[43m,\u001B[49m\u001B[43m \u001B[49m\u001B[43mencode_chunked\u001B[49m\u001B[38;5;241;43m=\u001B[39;49m\u001B[43mencode_chunked\u001B[49m\u001B[43m)\u001B[49m\n",
      "File \u001B[1;32mF:\\python38\\lib\\http\\client.py:1004\u001B[0m, in \u001B[0;36mHTTPConnection._send_output\u001B[1;34m(self, message_body, encode_chunked)\u001B[0m\n\u001B[0;32m   1003\u001B[0m \u001B[38;5;28;01mdel\u001B[39;00m \u001B[38;5;28mself\u001B[39m\u001B[38;5;241m.\u001B[39m_buffer[:]\n\u001B[1;32m-> 1004\u001B[0m \u001B[38;5;28;43mself\u001B[39;49m\u001B[38;5;241;43m.\u001B[39;49m\u001B[43msend\u001B[49m\u001B[43m(\u001B[49m\u001B[43mmsg\u001B[49m\u001B[43m)\u001B[49m\n\u001B[0;32m   1006\u001B[0m \u001B[38;5;28;01mif\u001B[39;00m message_body \u001B[38;5;129;01mis\u001B[39;00m \u001B[38;5;129;01mnot\u001B[39;00m \u001B[38;5;28;01mNone\u001B[39;00m:\n\u001B[0;32m   1007\u001B[0m \n\u001B[0;32m   1008\u001B[0m     \u001B[38;5;66;03m# create a consistent interface to message_body\u001B[39;00m\n",
      "File \u001B[1;32mF:\\python38\\lib\\http\\client.py:944\u001B[0m, in \u001B[0;36mHTTPConnection.send\u001B[1;34m(self, data)\u001B[0m\n\u001B[0;32m    943\u001B[0m \u001B[38;5;28;01mif\u001B[39;00m \u001B[38;5;28mself\u001B[39m\u001B[38;5;241m.\u001B[39mauto_open:\n\u001B[1;32m--> 944\u001B[0m     \u001B[38;5;28;43mself\u001B[39;49m\u001B[38;5;241;43m.\u001B[39;49m\u001B[43mconnect\u001B[49m\u001B[43m(\u001B[49m\u001B[43m)\u001B[49m\n\u001B[0;32m    945\u001B[0m \u001B[38;5;28;01melse\u001B[39;00m:\n",
      "File \u001B[1;32mF:\\python38\\lib\\http\\client.py:1399\u001B[0m, in \u001B[0;36mHTTPSConnection.connect\u001B[1;34m(self)\u001B[0m\n\u001B[0;32m   1397\u001B[0m     server_hostname \u001B[38;5;241m=\u001B[39m \u001B[38;5;28mself\u001B[39m\u001B[38;5;241m.\u001B[39mhost\n\u001B[1;32m-> 1399\u001B[0m \u001B[38;5;28mself\u001B[39m\u001B[38;5;241m.\u001B[39msock \u001B[38;5;241m=\u001B[39m \u001B[38;5;28;43mself\u001B[39;49m\u001B[38;5;241;43m.\u001B[39;49m\u001B[43m_context\u001B[49m\u001B[38;5;241;43m.\u001B[39;49m\u001B[43mwrap_socket\u001B[49m\u001B[43m(\u001B[49m\u001B[38;5;28;43mself\u001B[39;49m\u001B[38;5;241;43m.\u001B[39;49m\u001B[43msock\u001B[49m\u001B[43m,\u001B[49m\n\u001B[0;32m   1400\u001B[0m \u001B[43m                                      \u001B[49m\u001B[43mserver_hostname\u001B[49m\u001B[38;5;241;43m=\u001B[39;49m\u001B[43mserver_hostname\u001B[49m\u001B[43m)\u001B[49m\n",
      "File \u001B[1;32mF:\\python38\\lib\\ssl.py:500\u001B[0m, in \u001B[0;36mSSLContext.wrap_socket\u001B[1;34m(self, sock, server_side, do_handshake_on_connect, suppress_ragged_eofs, server_hostname, session)\u001B[0m\n\u001B[0;32m    494\u001B[0m \u001B[38;5;28;01mdef\u001B[39;00m \u001B[38;5;21mwrap_socket\u001B[39m(\u001B[38;5;28mself\u001B[39m, sock, server_side\u001B[38;5;241m=\u001B[39m\u001B[38;5;28;01mFalse\u001B[39;00m,\n\u001B[0;32m    495\u001B[0m                 do_handshake_on_connect\u001B[38;5;241m=\u001B[39m\u001B[38;5;28;01mTrue\u001B[39;00m,\n\u001B[0;32m    496\u001B[0m                 suppress_ragged_eofs\u001B[38;5;241m=\u001B[39m\u001B[38;5;28;01mTrue\u001B[39;00m,\n\u001B[0;32m    497\u001B[0m                 server_hostname\u001B[38;5;241m=\u001B[39m\u001B[38;5;28;01mNone\u001B[39;00m, session\u001B[38;5;241m=\u001B[39m\u001B[38;5;28;01mNone\u001B[39;00m):\n\u001B[0;32m    498\u001B[0m     \u001B[38;5;66;03m# SSLSocket class handles server_hostname encoding before it calls\u001B[39;00m\n\u001B[0;32m    499\u001B[0m     \u001B[38;5;66;03m# ctx._wrap_socket()\u001B[39;00m\n\u001B[1;32m--> 500\u001B[0m     \u001B[38;5;28;01mreturn\u001B[39;00m \u001B[38;5;28;43mself\u001B[39;49m\u001B[38;5;241;43m.\u001B[39;49m\u001B[43msslsocket_class\u001B[49m\u001B[38;5;241;43m.\u001B[39;49m\u001B[43m_create\u001B[49m\u001B[43m(\u001B[49m\n\u001B[0;32m    501\u001B[0m \u001B[43m        \u001B[49m\u001B[43msock\u001B[49m\u001B[38;5;241;43m=\u001B[39;49m\u001B[43msock\u001B[49m\u001B[43m,\u001B[49m\n\u001B[0;32m    502\u001B[0m \u001B[43m        \u001B[49m\u001B[43mserver_side\u001B[49m\u001B[38;5;241;43m=\u001B[39;49m\u001B[43mserver_side\u001B[49m\u001B[43m,\u001B[49m\n\u001B[0;32m    503\u001B[0m \u001B[43m        \u001B[49m\u001B[43mdo_handshake_on_connect\u001B[49m\u001B[38;5;241;43m=\u001B[39;49m\u001B[43mdo_handshake_on_connect\u001B[49m\u001B[43m,\u001B[49m\n\u001B[0;32m    504\u001B[0m \u001B[43m        \u001B[49m\u001B[43msuppress_ragged_eofs\u001B[49m\u001B[38;5;241;43m=\u001B[39;49m\u001B[43msuppress_ragged_eofs\u001B[49m\u001B[43m,\u001B[49m\n\u001B[0;32m    505\u001B[0m \u001B[43m        \u001B[49m\u001B[43mserver_hostname\u001B[49m\u001B[38;5;241;43m=\u001B[39;49m\u001B[43mserver_hostname\u001B[49m\u001B[43m,\u001B[49m\n\u001B[0;32m    506\u001B[0m \u001B[43m        \u001B[49m\u001B[43mcontext\u001B[49m\u001B[38;5;241;43m=\u001B[39;49m\u001B[38;5;28;43mself\u001B[39;49m\u001B[43m,\u001B[49m\n\u001B[0;32m    507\u001B[0m \u001B[43m        \u001B[49m\u001B[43msession\u001B[49m\u001B[38;5;241;43m=\u001B[39;49m\u001B[43msession\u001B[49m\n\u001B[0;32m    508\u001B[0m \u001B[43m    \u001B[49m\u001B[43m)\u001B[49m\n",
      "File \u001B[1;32mF:\\python38\\lib\\ssl.py:1040\u001B[0m, in \u001B[0;36mSSLSocket._create\u001B[1;34m(cls, sock, server_side, do_handshake_on_connect, suppress_ragged_eofs, server_hostname, context, session)\u001B[0m\n\u001B[0;32m   1039\u001B[0m             \u001B[38;5;28;01mraise\u001B[39;00m \u001B[38;5;167;01mValueError\u001B[39;00m(\u001B[38;5;124m\"\u001B[39m\u001B[38;5;124mdo_handshake_on_connect should not be specified for non-blocking sockets\u001B[39m\u001B[38;5;124m\"\u001B[39m)\n\u001B[1;32m-> 1040\u001B[0m         \u001B[38;5;28;43mself\u001B[39;49m\u001B[38;5;241;43m.\u001B[39;49m\u001B[43mdo_handshake\u001B[49m\u001B[43m(\u001B[49m\u001B[43m)\u001B[49m\n\u001B[0;32m   1041\u001B[0m \u001B[38;5;28;01mexcept\u001B[39;00m (\u001B[38;5;167;01mOSError\u001B[39;00m, \u001B[38;5;167;01mValueError\u001B[39;00m):\n",
      "File \u001B[1;32mF:\\python38\\lib\\ssl.py:1309\u001B[0m, in \u001B[0;36mSSLSocket.do_handshake\u001B[1;34m(self, block)\u001B[0m\n\u001B[0;32m   1308\u001B[0m         \u001B[38;5;28mself\u001B[39m\u001B[38;5;241m.\u001B[39msettimeout(\u001B[38;5;28;01mNone\u001B[39;00m)\n\u001B[1;32m-> 1309\u001B[0m     \u001B[38;5;28;43mself\u001B[39;49m\u001B[38;5;241;43m.\u001B[39;49m\u001B[43m_sslobj\u001B[49m\u001B[38;5;241;43m.\u001B[39;49m\u001B[43mdo_handshake\u001B[49m\u001B[43m(\u001B[49m\u001B[43m)\u001B[49m\n\u001B[0;32m   1310\u001B[0m \u001B[38;5;28;01mfinally\u001B[39;00m:\n",
      "\u001B[1;31mSSLCertVerificationError\u001B[0m: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: Hostname mismatch, certificate is not valid for 'archive.ics.uci.edu'. (_ssl.c:1108)",
      "\nDuring handling of the above exception, another exception occurred:\n",
      "\u001B[1;31mURLError\u001B[0m                                  Traceback (most recent call last)",
      "Cell \u001B[1;32mIn[16], line 6\u001B[0m\n\u001B[0;32m      1\u001B[0m \u001B[38;5;66;03m# 1. 读取数据源\u001B[39;00m\n\u001B[0;32m      2\u001B[0m column_name \u001B[38;5;241m=\u001B[39m [\u001B[38;5;124m'\u001B[39m\u001B[38;5;124mSample code number\u001B[39m\u001B[38;5;124m'\u001B[39m, \u001B[38;5;124m'\u001B[39m\u001B[38;5;124mClump Thickness\u001B[39m\u001B[38;5;124m'\u001B[39m, \u001B[38;5;124m'\u001B[39m\u001B[38;5;124mUniformity of Cell Size\u001B[39m\u001B[38;5;124m'\u001B[39m, \u001B[38;5;124m'\u001B[39m\u001B[38;5;124mUniformity of Cell Shape\u001B[39m\u001B[38;5;124m'\u001B[39m,\n\u001B[0;32m      3\u001B[0m                    \u001B[38;5;124m'\u001B[39m\u001B[38;5;124mMarginal Adhesion\u001B[39m\u001B[38;5;124m'\u001B[39m, \u001B[38;5;124m'\u001B[39m\u001B[38;5;124mSingle Epithelial Cell Size\u001B[39m\u001B[38;5;124m'\u001B[39m, \u001B[38;5;124m'\u001B[39m\u001B[38;5;124mBare Nuclei\u001B[39m\u001B[38;5;124m'\u001B[39m, \u001B[38;5;124m'\u001B[39m\u001B[38;5;124mBland Chromatin\u001B[39m\u001B[38;5;124m'\u001B[39m,\n\u001B[0;32m      4\u001B[0m                    \u001B[38;5;124m'\u001B[39m\u001B[38;5;124mNormal Nucleoli\u001B[39m\u001B[38;5;124m'\u001B[39m, \u001B[38;5;124m'\u001B[39m\u001B[38;5;124mMitoses\u001B[39m\u001B[38;5;124m'\u001B[39m, \u001B[38;5;124m'\u001B[39m\u001B[38;5;124mClass\u001B[39m\u001B[38;5;124m'\u001B[39m]\n\u001B[1;32m----> 6\u001B[0m df \u001B[38;5;241m=\u001B[39m \u001B[43mpd\u001B[49m\u001B[38;5;241;43m.\u001B[39;49m\u001B[43mread_csv\u001B[49m\u001B[43m(\u001B[49m\u001B[38;5;124;43m\"\u001B[39;49m\u001B[38;5;124;43mhttps://archive.ics.uci.edu/ml/machine-learning-databases/breast-cancer-wisconsin/breast-cancer-wisconsin.data\u001B[39;49m\u001B[38;5;124;43m\"\u001B[39;49m\u001B[43m,\u001B[49m\u001B[43mnames\u001B[49m\u001B[38;5;241;43m=\u001B[39;49m\u001B[43mcolumn_name\u001B[49m\u001B[43m)\u001B[49m\n\u001B[0;32m      7\u001B[0m df\n",
      "File \u001B[1;32mF:\\python38\\lib\\site-packages\\pandas\\util\\_decorators.py:311\u001B[0m, in \u001B[0;36mdeprecate_nonkeyword_arguments.<locals>.decorate.<locals>.wrapper\u001B[1;34m(*args, **kwargs)\u001B[0m\n\u001B[0;32m    305\u001B[0m \u001B[38;5;28;01mif\u001B[39;00m \u001B[38;5;28mlen\u001B[39m(args) \u001B[38;5;241m>\u001B[39m num_allow_args:\n\u001B[0;32m    306\u001B[0m     warnings\u001B[38;5;241m.\u001B[39mwarn(\n\u001B[0;32m    307\u001B[0m         msg\u001B[38;5;241m.\u001B[39mformat(arguments\u001B[38;5;241m=\u001B[39marguments),\n\u001B[0;32m    308\u001B[0m         \u001B[38;5;167;01mFutureWarning\u001B[39;00m,\n\u001B[0;32m    309\u001B[0m         stacklevel\u001B[38;5;241m=\u001B[39mstacklevel,\n\u001B[0;32m    310\u001B[0m     )\n\u001B[1;32m--> 311\u001B[0m \u001B[38;5;28;01mreturn\u001B[39;00m \u001B[43mfunc\u001B[49m\u001B[43m(\u001B[49m\u001B[38;5;241;43m*\u001B[39;49m\u001B[43margs\u001B[49m\u001B[43m,\u001B[49m\u001B[43m \u001B[49m\u001B[38;5;241;43m*\u001B[39;49m\u001B[38;5;241;43m*\u001B[39;49m\u001B[43mkwargs\u001B[49m\u001B[43m)\u001B[49m\n",
      "File \u001B[1;32mF:\\python38\\lib\\site-packages\\pandas\\io\\parsers\\readers.py:680\u001B[0m, in \u001B[0;36mread_csv\u001B[1;34m(filepath_or_buffer, sep, delimiter, header, names, index_col, usecols, squeeze, prefix, mangle_dupe_cols, dtype, engine, converters, true_values, false_values, skipinitialspace, skiprows, skipfooter, nrows, na_values, keep_default_na, na_filter, verbose, skip_blank_lines, parse_dates, infer_datetime_format, keep_date_col, date_parser, dayfirst, cache_dates, iterator, chunksize, compression, thousands, decimal, lineterminator, quotechar, quoting, doublequote, escapechar, comment, encoding, encoding_errors, dialect, error_bad_lines, warn_bad_lines, on_bad_lines, delim_whitespace, low_memory, memory_map, float_precision, storage_options)\u001B[0m\n\u001B[0;32m    665\u001B[0m kwds_defaults \u001B[38;5;241m=\u001B[39m _refine_defaults_read(\n\u001B[0;32m    666\u001B[0m     dialect,\n\u001B[0;32m    667\u001B[0m     delimiter,\n\u001B[1;32m   (...)\u001B[0m\n\u001B[0;32m    676\u001B[0m     defaults\u001B[38;5;241m=\u001B[39m{\u001B[38;5;124m\"\u001B[39m\u001B[38;5;124mdelimiter\u001B[39m\u001B[38;5;124m\"\u001B[39m: \u001B[38;5;124m\"\u001B[39m\u001B[38;5;124m,\u001B[39m\u001B[38;5;124m\"\u001B[39m},\n\u001B[0;32m    677\u001B[0m )\n\u001B[0;32m    678\u001B[0m kwds\u001B[38;5;241m.\u001B[39mupdate(kwds_defaults)\n\u001B[1;32m--> 680\u001B[0m \u001B[38;5;28;01mreturn\u001B[39;00m \u001B[43m_read\u001B[49m\u001B[43m(\u001B[49m\u001B[43mfilepath_or_buffer\u001B[49m\u001B[43m,\u001B[49m\u001B[43m \u001B[49m\u001B[43mkwds\u001B[49m\u001B[43m)\u001B[49m\n",
      "File \u001B[1;32mF:\\python38\\lib\\site-packages\\pandas\\io\\parsers\\readers.py:575\u001B[0m, in \u001B[0;36m_read\u001B[1;34m(filepath_or_buffer, kwds)\u001B[0m\n\u001B[0;32m    572\u001B[0m _validate_names(kwds\u001B[38;5;241m.\u001B[39mget(\u001B[38;5;124m\"\u001B[39m\u001B[38;5;124mnames\u001B[39m\u001B[38;5;124m\"\u001B[39m, \u001B[38;5;28;01mNone\u001B[39;00m))\n\u001B[0;32m    574\u001B[0m \u001B[38;5;66;03m# Create the parser.\u001B[39;00m\n\u001B[1;32m--> 575\u001B[0m parser \u001B[38;5;241m=\u001B[39m \u001B[43mTextFileReader\u001B[49m\u001B[43m(\u001B[49m\u001B[43mfilepath_or_buffer\u001B[49m\u001B[43m,\u001B[49m\u001B[43m \u001B[49m\u001B[38;5;241;43m*\u001B[39;49m\u001B[38;5;241;43m*\u001B[39;49m\u001B[43mkwds\u001B[49m\u001B[43m)\u001B[49m\n\u001B[0;32m    577\u001B[0m \u001B[38;5;28;01mif\u001B[39;00m chunksize \u001B[38;5;129;01mor\u001B[39;00m iterator:\n\u001B[0;32m    578\u001B[0m     \u001B[38;5;28;01mreturn\u001B[39;00m parser\n",
      "File \u001B[1;32mF:\\python38\\lib\\site-packages\\pandas\\io\\parsers\\readers.py:933\u001B[0m, in \u001B[0;36mTextFileReader.__init__\u001B[1;34m(self, f, engine, **kwds)\u001B[0m\n\u001B[0;32m    930\u001B[0m     \u001B[38;5;28mself\u001B[39m\u001B[38;5;241m.\u001B[39moptions[\u001B[38;5;124m\"\u001B[39m\u001B[38;5;124mhas_index_names\u001B[39m\u001B[38;5;124m\"\u001B[39m] \u001B[38;5;241m=\u001B[39m kwds[\u001B[38;5;124m\"\u001B[39m\u001B[38;5;124mhas_index_names\u001B[39m\u001B[38;5;124m\"\u001B[39m]\n\u001B[0;32m    932\u001B[0m \u001B[38;5;28mself\u001B[39m\u001B[38;5;241m.\u001B[39mhandles: IOHandles \u001B[38;5;241m|\u001B[39m \u001B[38;5;28;01mNone\u001B[39;00m \u001B[38;5;241m=\u001B[39m \u001B[38;5;28;01mNone\u001B[39;00m\n\u001B[1;32m--> 933\u001B[0m \u001B[38;5;28mself\u001B[39m\u001B[38;5;241m.\u001B[39m_engine \u001B[38;5;241m=\u001B[39m \u001B[38;5;28;43mself\u001B[39;49m\u001B[38;5;241;43m.\u001B[39;49m\u001B[43m_make_engine\u001B[49m\u001B[43m(\u001B[49m\u001B[43mf\u001B[49m\u001B[43m,\u001B[49m\u001B[43m \u001B[49m\u001B[38;5;28;43mself\u001B[39;49m\u001B[38;5;241;43m.\u001B[39;49m\u001B[43mengine\u001B[49m\u001B[43m)\u001B[49m\n",
      "File \u001B[1;32mF:\\python38\\lib\\site-packages\\pandas\\io\\parsers\\readers.py:1217\u001B[0m, in \u001B[0;36mTextFileReader._make_engine\u001B[1;34m(self, f, engine)\u001B[0m\n\u001B[0;32m   1213\u001B[0m     mode \u001B[38;5;241m=\u001B[39m \u001B[38;5;124m\"\u001B[39m\u001B[38;5;124mrb\u001B[39m\u001B[38;5;124m\"\u001B[39m\n\u001B[0;32m   1214\u001B[0m \u001B[38;5;66;03m# error: No overload variant of \"get_handle\" matches argument types\u001B[39;00m\n\u001B[0;32m   1215\u001B[0m \u001B[38;5;66;03m# \"Union[str, PathLike[str], ReadCsvBuffer[bytes], ReadCsvBuffer[str]]\"\u001B[39;00m\n\u001B[0;32m   1216\u001B[0m \u001B[38;5;66;03m# , \"str\", \"bool\", \"Any\", \"Any\", \"Any\", \"Any\", \"Any\"\u001B[39;00m\n\u001B[1;32m-> 1217\u001B[0m \u001B[38;5;28mself\u001B[39m\u001B[38;5;241m.\u001B[39mhandles \u001B[38;5;241m=\u001B[39m \u001B[43mget_handle\u001B[49m\u001B[43m(\u001B[49m\u001B[43m  \u001B[49m\u001B[38;5;66;43;03m# type: ignore[call-overload]\u001B[39;49;00m\n\u001B[0;32m   1218\u001B[0m \u001B[43m    \u001B[49m\u001B[43mf\u001B[49m\u001B[43m,\u001B[49m\n\u001B[0;32m   1219\u001B[0m \u001B[43m    \u001B[49m\u001B[43mmode\u001B[49m\u001B[43m,\u001B[49m\n\u001B[0;32m   1220\u001B[0m \u001B[43m    \u001B[49m\u001B[43mencoding\u001B[49m\u001B[38;5;241;43m=\u001B[39;49m\u001B[38;5;28;43mself\u001B[39;49m\u001B[38;5;241;43m.\u001B[39;49m\u001B[43moptions\u001B[49m\u001B[38;5;241;43m.\u001B[39;49m\u001B[43mget\u001B[49m\u001B[43m(\u001B[49m\u001B[38;5;124;43m\"\u001B[39;49m\u001B[38;5;124;43mencoding\u001B[39;49m\u001B[38;5;124;43m\"\u001B[39;49m\u001B[43m,\u001B[49m\u001B[43m \u001B[49m\u001B[38;5;28;43;01mNone\u001B[39;49;00m\u001B[43m)\u001B[49m\u001B[43m,\u001B[49m\n\u001B[0;32m   1221\u001B[0m \u001B[43m    \u001B[49m\u001B[43mcompression\u001B[49m\u001B[38;5;241;43m=\u001B[39;49m\u001B[38;5;28;43mself\u001B[39;49m\u001B[38;5;241;43m.\u001B[39;49m\u001B[43moptions\u001B[49m\u001B[38;5;241;43m.\u001B[39;49m\u001B[43mget\u001B[49m\u001B[43m(\u001B[49m\u001B[38;5;124;43m\"\u001B[39;49m\u001B[38;5;124;43mcompression\u001B[39;49m\u001B[38;5;124;43m\"\u001B[39;49m\u001B[43m,\u001B[49m\u001B[43m \u001B[49m\u001B[38;5;28;43;01mNone\u001B[39;49;00m\u001B[43m)\u001B[49m\u001B[43m,\u001B[49m\n\u001B[0;32m   1222\u001B[0m \u001B[43m    \u001B[49m\u001B[43mmemory_map\u001B[49m\u001B[38;5;241;43m=\u001B[39;49m\u001B[38;5;28;43mself\u001B[39;49m\u001B[38;5;241;43m.\u001B[39;49m\u001B[43moptions\u001B[49m\u001B[38;5;241;43m.\u001B[39;49m\u001B[43mget\u001B[49m\u001B[43m(\u001B[49m\u001B[38;5;124;43m\"\u001B[39;49m\u001B[38;5;124;43mmemory_map\u001B[39;49m\u001B[38;5;124;43m\"\u001B[39;49m\u001B[43m,\u001B[49m\u001B[43m \u001B[49m\u001B[38;5;28;43;01mFalse\u001B[39;49;00m\u001B[43m)\u001B[49m\u001B[43m,\u001B[49m\n\u001B[0;32m   1223\u001B[0m \u001B[43m    \u001B[49m\u001B[43mis_text\u001B[49m\u001B[38;5;241;43m=\u001B[39;49m\u001B[43mis_text\u001B[49m\u001B[43m,\u001B[49m\n\u001B[0;32m   1224\u001B[0m \u001B[43m    \u001B[49m\u001B[43merrors\u001B[49m\u001B[38;5;241;43m=\u001B[39;49m\u001B[38;5;28;43mself\u001B[39;49m\u001B[38;5;241;43m.\u001B[39;49m\u001B[43moptions\u001B[49m\u001B[38;5;241;43m.\u001B[39;49m\u001B[43mget\u001B[49m\u001B[43m(\u001B[49m\u001B[38;5;124;43m\"\u001B[39;49m\u001B[38;5;124;43mencoding_errors\u001B[39;49m\u001B[38;5;124;43m\"\u001B[39;49m\u001B[43m,\u001B[49m\u001B[43m \u001B[49m\u001B[38;5;124;43m\"\u001B[39;49m\u001B[38;5;124;43mstrict\u001B[39;49m\u001B[38;5;124;43m\"\u001B[39;49m\u001B[43m)\u001B[49m\u001B[43m,\u001B[49m\n\u001B[0;32m   1225\u001B[0m \u001B[43m    \u001B[49m\u001B[43mstorage_options\u001B[49m\u001B[38;5;241;43m=\u001B[39;49m\u001B[38;5;28;43mself\u001B[39;49m\u001B[38;5;241;43m.\u001B[39;49m\u001B[43moptions\u001B[49m\u001B[38;5;241;43m.\u001B[39;49m\u001B[43mget\u001B[49m\u001B[43m(\u001B[49m\u001B[38;5;124;43m\"\u001B[39;49m\u001B[38;5;124;43mstorage_options\u001B[39;49m\u001B[38;5;124;43m\"\u001B[39;49m\u001B[43m,\u001B[49m\u001B[43m \u001B[49m\u001B[38;5;28;43;01mNone\u001B[39;49;00m\u001B[43m)\u001B[49m\u001B[43m,\u001B[49m\n\u001B[0;32m   1226\u001B[0m \u001B[43m\u001B[49m\u001B[43m)\u001B[49m\n\u001B[0;32m   1227\u001B[0m \u001B[38;5;28;01massert\u001B[39;00m \u001B[38;5;28mself\u001B[39m\u001B[38;5;241m.\u001B[39mhandles \u001B[38;5;129;01mis\u001B[39;00m \u001B[38;5;129;01mnot\u001B[39;00m \u001B[38;5;28;01mNone\u001B[39;00m\n\u001B[0;32m   1228\u001B[0m f \u001B[38;5;241m=\u001B[39m \u001B[38;5;28mself\u001B[39m\u001B[38;5;241m.\u001B[39mhandles\u001B[38;5;241m.\u001B[39mhandle\n",
      "File \u001B[1;32mF:\\python38\\lib\\site-packages\\pandas\\io\\common.py:670\u001B[0m, in \u001B[0;36mget_handle\u001B[1;34m(path_or_buf, mode, encoding, compression, memory_map, is_text, errors, storage_options)\u001B[0m\n\u001B[0;32m    667\u001B[0m     codecs\u001B[38;5;241m.\u001B[39mlookup_error(errors)\n\u001B[0;32m    669\u001B[0m \u001B[38;5;66;03m# open URLs\u001B[39;00m\n\u001B[1;32m--> 670\u001B[0m ioargs \u001B[38;5;241m=\u001B[39m \u001B[43m_get_filepath_or_buffer\u001B[49m\u001B[43m(\u001B[49m\n\u001B[0;32m    671\u001B[0m \u001B[43m    \u001B[49m\u001B[43mpath_or_buf\u001B[49m\u001B[43m,\u001B[49m\n\u001B[0;32m    672\u001B[0m \u001B[43m    \u001B[49m\u001B[43mencoding\u001B[49m\u001B[38;5;241;43m=\u001B[39;49m\u001B[43mencoding\u001B[49m\u001B[43m,\u001B[49m\n\u001B[0;32m    673\u001B[0m \u001B[43m    \u001B[49m\u001B[43mcompression\u001B[49m\u001B[38;5;241;43m=\u001B[39;49m\u001B[43mcompression\u001B[49m\u001B[43m,\u001B[49m\n\u001B[0;32m    674\u001B[0m \u001B[43m    \u001B[49m\u001B[43mmode\u001B[49m\u001B[38;5;241;43m=\u001B[39;49m\u001B[43mmode\u001B[49m\u001B[43m,\u001B[49m\n\u001B[0;32m    675\u001B[0m \u001B[43m    \u001B[49m\u001B[43mstorage_options\u001B[49m\u001B[38;5;241;43m=\u001B[39;49m\u001B[43mstorage_options\u001B[49m\u001B[43m,\u001B[49m\n\u001B[0;32m    676\u001B[0m \u001B[43m\u001B[49m\u001B[43m)\u001B[49m\n\u001B[0;32m    678\u001B[0m handle \u001B[38;5;241m=\u001B[39m ioargs\u001B[38;5;241m.\u001B[39mfilepath_or_buffer\n\u001B[0;32m    679\u001B[0m handles: \u001B[38;5;28mlist\u001B[39m[BaseBuffer]\n",
      "File \u001B[1;32mF:\\python38\\lib\\site-packages\\pandas\\io\\common.py:339\u001B[0m, in \u001B[0;36m_get_filepath_or_buffer\u001B[1;34m(filepath_or_buffer, encoding, compression, mode, storage_options)\u001B[0m\n\u001B[0;32m    337\u001B[0m \u001B[38;5;66;03m# assuming storage_options is to be interpreted as headers\u001B[39;00m\n\u001B[0;32m    338\u001B[0m req_info \u001B[38;5;241m=\u001B[39m urllib\u001B[38;5;241m.\u001B[39mrequest\u001B[38;5;241m.\u001B[39mRequest(filepath_or_buffer, headers\u001B[38;5;241m=\u001B[39mstorage_options)\n\u001B[1;32m--> 339\u001B[0m \u001B[38;5;28;01mwith\u001B[39;00m \u001B[43murlopen\u001B[49m\u001B[43m(\u001B[49m\u001B[43mreq_info\u001B[49m\u001B[43m)\u001B[49m \u001B[38;5;28;01mas\u001B[39;00m req:\n\u001B[0;32m    340\u001B[0m     content_encoding \u001B[38;5;241m=\u001B[39m req\u001B[38;5;241m.\u001B[39mheaders\u001B[38;5;241m.\u001B[39mget(\u001B[38;5;124m\"\u001B[39m\u001B[38;5;124mContent-Encoding\u001B[39m\u001B[38;5;124m\"\u001B[39m, \u001B[38;5;28;01mNone\u001B[39;00m)\n\u001B[0;32m    341\u001B[0m     \u001B[38;5;28;01mif\u001B[39;00m content_encoding \u001B[38;5;241m==\u001B[39m \u001B[38;5;124m\"\u001B[39m\u001B[38;5;124mgzip\u001B[39m\u001B[38;5;124m\"\u001B[39m:\n\u001B[0;32m    342\u001B[0m         \u001B[38;5;66;03m# Override compression based on Content-Encoding header\u001B[39;00m\n",
      "File \u001B[1;32mF:\\python38\\lib\\site-packages\\pandas\\io\\common.py:239\u001B[0m, in \u001B[0;36murlopen\u001B[1;34m(*args, **kwargs)\u001B[0m\n\u001B[0;32m    233\u001B[0m \u001B[38;5;250m\u001B[39m\u001B[38;5;124;03m\"\"\"\u001B[39;00m\n\u001B[0;32m    234\u001B[0m \u001B[38;5;124;03mLazy-import wrapper for stdlib urlopen, as that imports a big chunk of\u001B[39;00m\n\u001B[0;32m    235\u001B[0m \u001B[38;5;124;03mthe stdlib.\u001B[39;00m\n\u001B[0;32m    236\u001B[0m \u001B[38;5;124;03m\"\"\"\u001B[39;00m\n\u001B[0;32m    237\u001B[0m \u001B[38;5;28;01mimport\u001B[39;00m \u001B[38;5;21;01murllib\u001B[39;00m\u001B[38;5;21;01m.\u001B[39;00m\u001B[38;5;21;01mrequest\u001B[39;00m\n\u001B[1;32m--> 239\u001B[0m \u001B[38;5;28;01mreturn\u001B[39;00m \u001B[43murllib\u001B[49m\u001B[38;5;241;43m.\u001B[39;49m\u001B[43mrequest\u001B[49m\u001B[38;5;241;43m.\u001B[39;49m\u001B[43murlopen\u001B[49m\u001B[43m(\u001B[49m\u001B[38;5;241;43m*\u001B[39;49m\u001B[43margs\u001B[49m\u001B[43m,\u001B[49m\u001B[43m \u001B[49m\u001B[38;5;241;43m*\u001B[39;49m\u001B[38;5;241;43m*\u001B[39;49m\u001B[43mkwargs\u001B[49m\u001B[43m)\u001B[49m\n",
      "File \u001B[1;32mF:\\python38\\lib\\urllib\\request.py:222\u001B[0m, in \u001B[0;36murlopen\u001B[1;34m(url, data, timeout, cafile, capath, cadefault, context)\u001B[0m\n\u001B[0;32m    220\u001B[0m \u001B[38;5;28;01melse\u001B[39;00m:\n\u001B[0;32m    221\u001B[0m     opener \u001B[38;5;241m=\u001B[39m _opener\n\u001B[1;32m--> 222\u001B[0m \u001B[38;5;28;01mreturn\u001B[39;00m \u001B[43mopener\u001B[49m\u001B[38;5;241;43m.\u001B[39;49m\u001B[43mopen\u001B[49m\u001B[43m(\u001B[49m\u001B[43murl\u001B[49m\u001B[43m,\u001B[49m\u001B[43m \u001B[49m\u001B[43mdata\u001B[49m\u001B[43m,\u001B[49m\u001B[43m \u001B[49m\u001B[43mtimeout\u001B[49m\u001B[43m)\u001B[49m\n",
      "File \u001B[1;32mF:\\python38\\lib\\urllib\\request.py:525\u001B[0m, in \u001B[0;36mOpenerDirector.open\u001B[1;34m(self, fullurl, data, timeout)\u001B[0m\n\u001B[0;32m    522\u001B[0m     req \u001B[38;5;241m=\u001B[39m meth(req)\n\u001B[0;32m    524\u001B[0m sys\u001B[38;5;241m.\u001B[39maudit(\u001B[38;5;124m'\u001B[39m\u001B[38;5;124murllib.Request\u001B[39m\u001B[38;5;124m'\u001B[39m, req\u001B[38;5;241m.\u001B[39mfull_url, req\u001B[38;5;241m.\u001B[39mdata, req\u001B[38;5;241m.\u001B[39mheaders, req\u001B[38;5;241m.\u001B[39mget_method())\n\u001B[1;32m--> 525\u001B[0m response \u001B[38;5;241m=\u001B[39m \u001B[38;5;28;43mself\u001B[39;49m\u001B[38;5;241;43m.\u001B[39;49m\u001B[43m_open\u001B[49m\u001B[43m(\u001B[49m\u001B[43mreq\u001B[49m\u001B[43m,\u001B[49m\u001B[43m \u001B[49m\u001B[43mdata\u001B[49m\u001B[43m)\u001B[49m\n\u001B[0;32m    527\u001B[0m \u001B[38;5;66;03m# post-process response\u001B[39;00m\n\u001B[0;32m    528\u001B[0m meth_name \u001B[38;5;241m=\u001B[39m protocol\u001B[38;5;241m+\u001B[39m\u001B[38;5;124m\"\u001B[39m\u001B[38;5;124m_response\u001B[39m\u001B[38;5;124m\"\u001B[39m\n",
      "File \u001B[1;32mF:\\python38\\lib\\urllib\\request.py:542\u001B[0m, in \u001B[0;36mOpenerDirector._open\u001B[1;34m(self, req, data)\u001B[0m\n\u001B[0;32m    539\u001B[0m     \u001B[38;5;28;01mreturn\u001B[39;00m result\n\u001B[0;32m    541\u001B[0m protocol \u001B[38;5;241m=\u001B[39m req\u001B[38;5;241m.\u001B[39mtype\n\u001B[1;32m--> 542\u001B[0m result \u001B[38;5;241m=\u001B[39m \u001B[38;5;28;43mself\u001B[39;49m\u001B[38;5;241;43m.\u001B[39;49m\u001B[43m_call_chain\u001B[49m\u001B[43m(\u001B[49m\u001B[38;5;28;43mself\u001B[39;49m\u001B[38;5;241;43m.\u001B[39;49m\u001B[43mhandle_open\u001B[49m\u001B[43m,\u001B[49m\u001B[43m \u001B[49m\u001B[43mprotocol\u001B[49m\u001B[43m,\u001B[49m\u001B[43m \u001B[49m\u001B[43mprotocol\u001B[49m\u001B[43m \u001B[49m\u001B[38;5;241;43m+\u001B[39;49m\n\u001B[0;32m    543\u001B[0m \u001B[43m                          \u001B[49m\u001B[38;5;124;43m'\u001B[39;49m\u001B[38;5;124;43m_open\u001B[39;49m\u001B[38;5;124;43m'\u001B[39;49m\u001B[43m,\u001B[49m\u001B[43m \u001B[49m\u001B[43mreq\u001B[49m\u001B[43m)\u001B[49m\n\u001B[0;32m    544\u001B[0m \u001B[38;5;28;01mif\u001B[39;00m result:\n\u001B[0;32m    545\u001B[0m     \u001B[38;5;28;01mreturn\u001B[39;00m result\n",
      "File \u001B[1;32mF:\\python38\\lib\\urllib\\request.py:502\u001B[0m, in \u001B[0;36mOpenerDirector._call_chain\u001B[1;34m(self, chain, kind, meth_name, *args)\u001B[0m\n\u001B[0;32m    500\u001B[0m \u001B[38;5;28;01mfor\u001B[39;00m handler \u001B[38;5;129;01min\u001B[39;00m handlers:\n\u001B[0;32m    501\u001B[0m     func \u001B[38;5;241m=\u001B[39m \u001B[38;5;28mgetattr\u001B[39m(handler, meth_name)\n\u001B[1;32m--> 502\u001B[0m     result \u001B[38;5;241m=\u001B[39m \u001B[43mfunc\u001B[49m\u001B[43m(\u001B[49m\u001B[38;5;241;43m*\u001B[39;49m\u001B[43margs\u001B[49m\u001B[43m)\u001B[49m\n\u001B[0;32m    503\u001B[0m     \u001B[38;5;28;01mif\u001B[39;00m result \u001B[38;5;129;01mis\u001B[39;00m \u001B[38;5;129;01mnot\u001B[39;00m \u001B[38;5;28;01mNone\u001B[39;00m:\n\u001B[0;32m    504\u001B[0m         \u001B[38;5;28;01mreturn\u001B[39;00m result\n",
      "File \u001B[1;32mF:\\python38\\lib\\urllib\\request.py:1360\u001B[0m, in \u001B[0;36mHTTPSHandler.https_open\u001B[1;34m(self, req)\u001B[0m\n\u001B[0;32m   1359\u001B[0m \u001B[38;5;28;01mdef\u001B[39;00m \u001B[38;5;21mhttps_open\u001B[39m(\u001B[38;5;28mself\u001B[39m, req):\n\u001B[1;32m-> 1360\u001B[0m     \u001B[38;5;28;01mreturn\u001B[39;00m \u001B[38;5;28;43mself\u001B[39;49m\u001B[38;5;241;43m.\u001B[39;49m\u001B[43mdo_open\u001B[49m\u001B[43m(\u001B[49m\u001B[43mhttp\u001B[49m\u001B[38;5;241;43m.\u001B[39;49m\u001B[43mclient\u001B[49m\u001B[38;5;241;43m.\u001B[39;49m\u001B[43mHTTPSConnection\u001B[49m\u001B[43m,\u001B[49m\u001B[43m \u001B[49m\u001B[43mreq\u001B[49m\u001B[43m,\u001B[49m\n\u001B[0;32m   1361\u001B[0m \u001B[43m        \u001B[49m\u001B[43mcontext\u001B[49m\u001B[38;5;241;43m=\u001B[39;49m\u001B[38;5;28;43mself\u001B[39;49m\u001B[38;5;241;43m.\u001B[39;49m\u001B[43m_context\u001B[49m\u001B[43m,\u001B[49m\u001B[43m \u001B[49m\u001B[43mcheck_hostname\u001B[49m\u001B[38;5;241;43m=\u001B[39;49m\u001B[38;5;28;43mself\u001B[39;49m\u001B[38;5;241;43m.\u001B[39;49m\u001B[43m_check_hostname\u001B[49m\u001B[43m)\u001B[49m\n",
      "File \u001B[1;32mF:\\python38\\lib\\urllib\\request.py:1320\u001B[0m, in \u001B[0;36mAbstractHTTPHandler.do_open\u001B[1;34m(self, http_class, req, **http_conn_args)\u001B[0m\n\u001B[0;32m   1317\u001B[0m         h\u001B[38;5;241m.\u001B[39mrequest(req\u001B[38;5;241m.\u001B[39mget_method(), req\u001B[38;5;241m.\u001B[39mselector, req\u001B[38;5;241m.\u001B[39mdata, headers,\n\u001B[0;32m   1318\u001B[0m                   encode_chunked\u001B[38;5;241m=\u001B[39mreq\u001B[38;5;241m.\u001B[39mhas_header(\u001B[38;5;124m'\u001B[39m\u001B[38;5;124mTransfer-encoding\u001B[39m\u001B[38;5;124m'\u001B[39m))\n\u001B[0;32m   1319\u001B[0m     \u001B[38;5;28;01mexcept\u001B[39;00m \u001B[38;5;167;01mOSError\u001B[39;00m \u001B[38;5;28;01mas\u001B[39;00m err: \u001B[38;5;66;03m# timeout error\u001B[39;00m\n\u001B[1;32m-> 1320\u001B[0m         \u001B[38;5;28;01mraise\u001B[39;00m URLError(err)\n\u001B[0;32m   1321\u001B[0m     r \u001B[38;5;241m=\u001B[39m h\u001B[38;5;241m.\u001B[39mgetresponse()\n\u001B[0;32m   1322\u001B[0m \u001B[38;5;28;01mexcept\u001B[39;00m:\n",
      "\u001B[1;31mURLError\u001B[0m: <urlopen error [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: Hostname mismatch, certificate is not valid for 'archive.ics.uci.edu'. (_ssl.c:1108)>"
     ]
    }
   ],
   "source": [
    "# 1. 读取数据源\n",
    "column_name = ['Sample code number', 'Clump Thickness', 'Uniformity of Cell Size', 'Uniformity of Cell Shape',\n",
    "                   'Marginal Adhesion', 'Single Epithelial Cell Size', 'Bare Nuclei', 'Bland Chromatin',\n",
    "                   'Normal Nucleoli', 'Mitoses', 'Class']\n",
    "\n",
    "df = pd.read_csv(\"https://archive.ics.uci.edu/ml/machine-learning-databases/breast-cancer-wisconsin/breast-cancer-wisconsin.data\",names=column_name)\n",
    "df"
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%%\n"
    }
   }
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "outputs": [
    {
     "ename": "NameError",
     "evalue": "name 'df' is not defined",
     "output_type": "error",
     "traceback": [
      "\u001B[1;31m---------------------------------------------------------------------------\u001B[0m",
      "\u001B[1;31mNameError\u001B[0m                                 Traceback (most recent call last)",
      "Cell \u001B[1;32mIn[9], line 2\u001B[0m\n\u001B[0;32m      1\u001B[0m \u001B[38;5;66;03m# 2. 数据清洗\u001B[39;00m\n\u001B[1;32m----> 2\u001B[0m \u001B[43mdf\u001B[49m\u001B[38;5;241m.\u001B[39mreplace(to_replace\u001B[38;5;241m=\u001B[39m\u001B[38;5;124m\"\u001B[39m\u001B[38;5;124m?\u001B[39m\u001B[38;5;124m\"\u001B[39m,value\u001B[38;5;241m=\u001B[39mnp\u001B[38;5;241m.\u001B[39mnan,inplace\u001B[38;5;241m=\u001B[39m\u001B[38;5;28;01mTrue\u001B[39;00m)\n\u001B[0;32m      3\u001B[0m \u001B[38;5;66;03m# 删除行\u001B[39;00m\n\u001B[0;32m      4\u001B[0m df\u001B[38;5;241m.\u001B[39mdropna(inplace\u001B[38;5;241m=\u001B[39m\u001B[38;5;28;01mTrue\u001B[39;00m)\n",
      "\u001B[1;31mNameError\u001B[0m: name 'df' is not defined"
     ]
    }
   ],
   "source": [
    "# 2. 数据清洗\n",
    "df.replace(to_replace=\"?\",value=np.nan,inplace=True)\n",
    "# 删除行\n",
    "df.dropna(inplace=True)\n",
    "# df.isnull().any()\n",
    "# df.isnull().sum()"
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%%\n"
    }
   }
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "outputs": [
    {
     "ename": "NameError",
     "evalue": "name 'df' is not defined",
     "output_type": "error",
     "traceback": [
      "\u001B[1;31m---------------------------------------------------------------------------\u001B[0m",
      "\u001B[1;31mNameError\u001B[0m                                 Traceback (most recent call last)",
      "Cell \u001B[1;32mIn[3], line 2\u001B[0m\n\u001B[0;32m      1\u001B[0m \u001B[38;5;66;03m# 3.选择特征和目标值，切分数据集\u001B[39;00m\n\u001B[1;32m----> 2\u001B[0m X \u001B[38;5;241m=\u001B[39m \u001B[43mdf\u001B[49m\u001B[38;5;241m.\u001B[39miloc[:,\u001B[38;5;241m1\u001B[39m:\u001B[38;5;241m10\u001B[39m]\n\u001B[0;32m      3\u001B[0m y \u001B[38;5;241m=\u001B[39m df[\u001B[38;5;124m\"\u001B[39m\u001B[38;5;124mClass\u001B[39m\u001B[38;5;124m\"\u001B[39m]\n\u001B[0;32m      4\u001B[0m X_train, X_test, y_train, y_test \u001B[38;5;241m=\u001B[39m train_test_split(\n\u001B[0;32m      5\u001B[0m     X, y, test_size\u001B[38;5;241m=\u001B[39m\u001B[38;5;241m0.33\u001B[39m, random_state\u001B[38;5;241m=\u001B[39m\u001B[38;5;241m42\u001B[39m)\n",
      "\u001B[1;31mNameError\u001B[0m: name 'df' is not defined"
     ]
    }
   ],
   "source": [
    "# 3.选择特征和目标值，切分数据集\n",
    "X = df.iloc[:,1:10]\n",
    "y = df[\"Class\"]\n",
    "X_train, X_test, y_train, y_test = train_test_split(\n",
    "    X, y, test_size=0.33, random_state=42)\n",
    "display(X_train,X_test)"
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%%\n"
    }
   }
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "outputs": [
    {
     "data": {
      "text/plain": "array([[ 0.20220015, -0.70387375,  0.25631567, ..., -0.15699483,\n        -0.25923575, -0.33972672],\n       [-0.15457772, -0.37327734, -0.73917663, ..., -0.58661542,\n        -0.60163672, -0.33972672],\n       [-0.51135559, -0.70387375, -0.73917663, ..., -0.58661542,\n        -0.60163672, -0.33972672],\n       ...,\n       [ 1.98608949,  0.61851188,  1.25180796, ..., -0.15699483,\n         0.08316523,  4.40606266],\n       [-0.15457772, -0.70387375, -0.73917663, ..., -0.58661542,\n        -0.60163672, -0.33972672],\n       [ 1.98608949,  2.27149391,  2.24730026, ...,  1.9911081 ,\n         1.79517008,  4.40606266]])"
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/plain": "array([[ 1.27253375, -0.04268094,  0.25631567, ..., -0.15699483,\n         0.08316523, -0.33972672],\n       [ 1.27253375,  1.6103011 ,  1.25180796, ...,  1.56148751,\n         1.79517008,  3.72809275],\n       [-1.22491132, -0.70387375, -0.73917663, ..., -0.15699483,\n        -0.60163672, -0.33972672],\n       ...,\n       [-1.22491132, -0.70387375, -0.73917663, ..., -1.016236  ,\n        -0.60163672, -0.33972672],\n       [-0.51135559, -0.70387375, -0.40734586, ..., -0.58661542,\n        -0.60163672, -0.33972672],\n       [-0.51135559, -0.70387375, -0.73917663, ..., -0.58661542,\n        -0.60163672, -0.33972672]])"
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# 4.特征工程-标准化\n",
    "transfer = StandardScaler()\n",
    "X_train = transfer.fit_transform(X_train)\n",
    "X_test = transfer.transform(X_test)\n",
    "display(X_train,X_test)"
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%%\n"
    }
   }
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "outputs": [
    {
     "data": {
      "text/plain": "LogisticRegression()",
      "text/html": "<style>#sk-container-id-1 {color: black;}#sk-container-id-1 pre{padding: 0;}#sk-container-id-1 div.sk-toggleable {background-color: white;}#sk-container-id-1 label.sk-toggleable__label {cursor: pointer;display: block;width: 100%;margin-bottom: 0;padding: 0.3em;box-sizing: border-box;text-align: center;}#sk-container-id-1 label.sk-toggleable__label-arrow:before {content: \"▸\";float: left;margin-right: 0.25em;color: #696969;}#sk-container-id-1 label.sk-toggleable__label-arrow:hover:before {color: black;}#sk-container-id-1 div.sk-estimator:hover label.sk-toggleable__label-arrow:before {color: black;}#sk-container-id-1 div.sk-toggleable__content {max-height: 0;max-width: 0;overflow: hidden;text-align: left;background-color: #f0f8ff;}#sk-container-id-1 div.sk-toggleable__content pre {margin: 0.2em;color: black;border-radius: 0.25em;background-color: #f0f8ff;}#sk-container-id-1 input.sk-toggleable__control:checked~div.sk-toggleable__content {max-height: 200px;max-width: 100%;overflow: auto;}#sk-container-id-1 input.sk-toggleable__control:checked~label.sk-toggleable__label-arrow:before {content: \"▾\";}#sk-container-id-1 div.sk-estimator input.sk-toggleable__control:checked~label.sk-toggleable__label {background-color: #d4ebff;}#sk-container-id-1 div.sk-label input.sk-toggleable__control:checked~label.sk-toggleable__label {background-color: #d4ebff;}#sk-container-id-1 input.sk-hidden--visually {border: 0;clip: rect(1px 1px 1px 1px);clip: rect(1px, 1px, 1px, 1px);height: 1px;margin: -1px;overflow: hidden;padding: 0;position: absolute;width: 1px;}#sk-container-id-1 div.sk-estimator {font-family: monospace;background-color: #f0f8ff;border: 1px dotted black;border-radius: 0.25em;box-sizing: border-box;margin-bottom: 0.5em;}#sk-container-id-1 div.sk-estimator:hover {background-color: #d4ebff;}#sk-container-id-1 div.sk-parallel-item::after {content: \"\";width: 100%;border-bottom: 1px solid gray;flex-grow: 1;}#sk-container-id-1 div.sk-label:hover label.sk-toggleable__label {background-color: #d4ebff;}#sk-container-id-1 div.sk-serial::before {content: \"\";position: absolute;border-left: 1px solid gray;box-sizing: border-box;top: 0;bottom: 0;left: 50%;z-index: 0;}#sk-container-id-1 div.sk-serial {display: flex;flex-direction: column;align-items: center;background-color: white;padding-right: 0.2em;padding-left: 0.2em;position: relative;}#sk-container-id-1 div.sk-item {position: relative;z-index: 1;}#sk-container-id-1 div.sk-parallel {display: flex;align-items: stretch;justify-content: center;background-color: white;position: relative;}#sk-container-id-1 div.sk-item::before, #sk-container-id-1 div.sk-parallel-item::before {content: \"\";position: absolute;border-left: 1px solid gray;box-sizing: border-box;top: 0;bottom: 0;left: 50%;z-index: -1;}#sk-container-id-1 div.sk-parallel-item {display: flex;flex-direction: column;z-index: 1;position: relative;background-color: white;}#sk-container-id-1 div.sk-parallel-item:first-child::after {align-self: flex-end;width: 50%;}#sk-container-id-1 div.sk-parallel-item:last-child::after {align-self: flex-start;width: 50%;}#sk-container-id-1 div.sk-parallel-item:only-child::after {width: 0;}#sk-container-id-1 div.sk-dashed-wrapped {border: 1px dashed gray;margin: 0 0.4em 0.5em 0.4em;box-sizing: border-box;padding-bottom: 0.4em;background-color: white;}#sk-container-id-1 div.sk-label label {font-family: monospace;font-weight: bold;display: inline-block;line-height: 1.2em;}#sk-container-id-1 div.sk-label-container {text-align: center;}#sk-container-id-1 div.sk-container {/* jupyter's `normalize.less` sets `[hidden] { display: none; }` but bootstrap.min.css set `[hidden] { display: none !important; }` so we also need the `!important` here to be able to override the default hidden behavior on the sphinx rendered scikit-learn.org. See: https://github.com/scikit-learn/scikit-learn/issues/21755 */display: inline-block !important;position: relative;}#sk-container-id-1 div.sk-text-repr-fallback {display: none;}</style><div id=\"sk-container-id-1\" class=\"sk-top-container\"><div class=\"sk-text-repr-fallback\"><pre>LogisticRegression()</pre><b>In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook. <br />On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.</b></div><div class=\"sk-container\" hidden><div class=\"sk-item\"><div class=\"sk-estimator sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-1\" type=\"checkbox\" checked><label for=\"sk-estimator-id-1\" class=\"sk-toggleable__label sk-toggleable__label-arrow\">LogisticRegression</label><div class=\"sk-toggleable__content\"><pre>LogisticRegression()</pre></div></div></div></div></div>"
     },
     "execution_count": 13,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "import joblib\n",
    "# 5.训练模型\n",
    "# lr = LogisticRegression()\n",
    "# lr.fit(X_train,y_train)\n",
    "# lr.coef_\n",
    "# lr.intercept_\n",
    "\n",
    "# 保存模型\n",
    "# joblib.dump(lr,\"mylr.pki\")\n",
    "# 加载模型\n",
    "lr = joblib.load(\"mylr.pki\")\n",
    "lr"
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%%\n"
    }
   }
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "outputs": [
    {
     "ename": "NameError",
     "evalue": "name 'X_test' is not defined",
     "output_type": "error",
     "traceback": [
      "\u001B[1;31m---------------------------------------------------------------------------\u001B[0m",
      "\u001B[1;31mNameError\u001B[0m                                 Traceback (most recent call last)",
      "Cell \u001B[1;32mIn[14], line 2\u001B[0m\n\u001B[0;32m      1\u001B[0m \u001B[38;5;66;03m# 6.评估模型\u001B[39;00m\n\u001B[1;32m----> 2\u001B[0m y_pred \u001B[38;5;241m=\u001B[39m lr\u001B[38;5;241m.\u001B[39mpredict(\u001B[43mX_test\u001B[49m)\n",
      "\u001B[1;31mNameError\u001B[0m: name 'X_test' is not defined"
     ]
    }
   ],
   "source": [
    "# 6.评估模型\n",
    "y_pred = lr.predict(X_test)"
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%%\n"
    }
   }
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "outputs": [
    {
     "ename": "NameError",
     "evalue": "name 'X_test' is not defined",
     "output_type": "error",
     "traceback": [
      "\u001B[1;31m---------------------------------------------------------------------------\u001B[0m",
      "\u001B[1;31mNameError\u001B[0m                                 Traceback (most recent call last)",
      "Cell \u001B[1;32mIn[15], line 3\u001B[0m\n\u001B[0;32m      1\u001B[0m \u001B[38;5;66;03m# 参数训练集的\u001B[39;00m\n\u001B[0;32m      2\u001B[0m \u001B[38;5;66;03m# 准确率\u001B[39;00m\n\u001B[1;32m----> 3\u001B[0m score \u001B[38;5;241m=\u001B[39m lr\u001B[38;5;241m.\u001B[39mscore(\u001B[43mX_test\u001B[49m, y_test)\n\u001B[0;32m      4\u001B[0m \u001B[38;5;28mprint\u001B[39m(\u001B[38;5;124m\"\u001B[39m\u001B[38;5;124m准确率为：\u001B[39m\u001B[38;5;130;01m\\n\u001B[39;00m\u001B[38;5;124m\"\u001B[39m, score)\n",
      "\u001B[1;31mNameError\u001B[0m: name 'X_test' is not defined"
     ]
    }
   ],
   "source": [
    "# 参数训练集的\n",
    "# 准确率\n",
    "score = lr.score(X_test, y_test)\n",
    "print(\"准确率为：\\n\", score)\n"
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%%\n"
    }
   }
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "              precision    recall  f1-score   support\n",
      "\n",
      "          良性       0.95      0.99      0.97       142\n",
      "          恶性       0.97      0.90      0.94        84\n",
      "\n",
      "   micro avg       0.96      0.96      0.96       226\n",
      "   macro avg       0.96      0.95      0.95       226\n",
      "weighted avg       0.96      0.96      0.96       226\n",
      "\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "F:\\python38\\lib\\site-packages\\numpy\\lib\\arraysetops.py:604: FutureWarning: elementwise comparison failed; returning scalar instead, but in the future will perform elementwise comparison\n",
      "  mask &= (ar1 != a)\n",
      "F:\\python38\\lib\\site-packages\\numpy\\lib\\arraysetops.py:604: FutureWarning: elementwise comparison failed; returning scalar instead, but in the future will perform elementwise comparison\n",
      "  mask &= (ar1 != a)\n",
      "F:\\python38\\lib\\site-packages\\numpy\\lib\\arraysetops.py:604: FutureWarning: elementwise comparison failed; returning scalar instead, but in the future will perform elementwise comparison\n",
      "  mask &= (ar1 != a)\n",
      "F:\\python38\\lib\\site-packages\\numpy\\lib\\arraysetops.py:604: FutureWarning: elementwise comparison failed; returning scalar instead, but in the future will perform elementwise comparison\n",
      "  mask &= (ar1 != a)\n"
     ]
    }
   ],
   "source": [
    "# 分类报告\n",
    "from sklearn.metrics import classification_report\n",
    "result = classification_report(y_test, y_pred,labels=[\"2\",\"4\"],target_names=[\"良性\",\"恶性\"])\n",
    "print(result)"
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%%\n"
    }
   }
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "outputs": [
    {
     "data": {
      "text/plain": "0.9453386988598256"
     },
     "execution_count": 19,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# AUC指标\n",
    "from sklearn.metrics import roc_auc_score\n",
    "y_true = np.where(y_test > 3, 1, 0)\n",
    "y_true\n",
    "roc_auc_score(y_true,y_pred)"
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%%\n"
    }
   }
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "outputs": [
    {
     "data": {
      "text/plain": "array([0.37168142, 0.97435897, 1.        ])"
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/plain": "array([1.       , 0.9047619, 0.       ])"
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/plain": "array([2, 4], dtype=int64)"
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/plain": "<Figure size 640x480 with 1 Axes>",
      "image/png": "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jEp3fI4fP24CgYBZsmSJeeutt8wLL7xgJk+ebB5//HFbP0JGjfa/rRtvvNHU1tZmO9ysS3d8Vq9ebQKBgPn3f/93c/ToUfP73//eTJ8+3Xzzm9+09SNkTLpj88c//tH8+te/NkeOHDEvv/yy+fKXv2wuv/xy88knn1j6CTKrtbXVvPrqq+bVV181ksy6devMq6++at59911jjDHLli0z8+fPT96fWNr7j//4j+bNN980GzduZGlvLvrpT39qLrvsMuPxeMycOXPMH//4x+TXbr75ZrNw4cIhny3kZMSY9MbmwQcfTN5bWlpqbr311oJd55+Q7u/OK6+8YiorK43X6zXTpk0zP/zhD013d3eWo86edMfnL3/5i5Fkfv/732c5UjvSGZ+uri7zgx/8wEyfPt34fD4TCoXM3//93xfsH9x0xmbv3r3m6quvNl6v11x88cVm/vz55r333rMQdXb84Q9/MJIGvRJjsnDhQnPzzTcPembmzJnG4/GYadOmZXz/HocxBVSvAwAAeYeeEQAAYBXJCAAAsIpkBAAAWEUyAgAArCIZAQAAVpGMAAAAq0hGAACAVSQjAADAKpIRAABgFckIAACwimQEAABYRTICAACs+v9cMvoiimtNJQAAAABJRU5ErkJggg=="
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "#画图\n",
    "# PR 曲线\n",
    "from sklearn.metrics import precision_recall_curve\n",
    "import matplotlib.pyplot as plt\n",
    "precision, recall, thresholds = precision_recall_curve(y_true,y_pred)\n",
    "display(precision,recall,thresholds)\n",
    "plt.plot(precision,recall)\n",
    "plt.show()"
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%%\n"
    }
   }
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "outputs": [
    {
     "ename": "NameError",
     "evalue": "name 'y_true' is not defined",
     "output_type": "error",
     "traceback": [
      "\u001B[1;31m---------------------------------------------------------------------------\u001B[0m",
      "\u001B[1;31mNameError\u001B[0m                                 Traceback (most recent call last)",
      "Cell \u001B[1;32mIn[6], line 4\u001B[0m\n\u001B[0;32m      2\u001B[0m \u001B[38;5;28;01mfrom\u001B[39;00m \u001B[38;5;21;01msklearn\u001B[39;00m\u001B[38;5;21;01m.\u001B[39;00m\u001B[38;5;21;01mmetrics\u001B[39;00m \u001B[38;5;28;01mimport\u001B[39;00m RocCurveDisplay\n\u001B[0;32m      3\u001B[0m \u001B[38;5;28;01mfrom\u001B[39;00m \u001B[38;5;21;01msklearn\u001B[39;00m \u001B[38;5;28;01mimport\u001B[39;00m metrics\n\u001B[1;32m----> 4\u001B[0m fpr, tpr, thresholds \u001B[38;5;241m=\u001B[39m metrics\u001B[38;5;241m.\u001B[39mroc_curve(\u001B[43my_true\u001B[49m, y_pred)\n\u001B[0;32m      5\u001B[0m roc_auc \u001B[38;5;241m=\u001B[39m metrics\u001B[38;5;241m.\u001B[39mauc(fpr, tpr)\n\u001B[0;32m      6\u001B[0m display \u001B[38;5;241m=\u001B[39m metrics\u001B[38;5;241m.\u001B[39mRocCurveDisplay(fpr\u001B[38;5;241m=\u001B[39mfpr, tpr\u001B[38;5;241m=\u001B[39mtpr, roc_auc\u001B[38;5;241m=\u001B[39mroc_auc,\n\u001B[0;32m      7\u001B[0m                                   estimator_name\u001B[38;5;241m=\u001B[39m\u001B[38;5;124m'\u001B[39m\u001B[38;5;124mexample estimator\u001B[39m\u001B[38;5;124m'\u001B[39m)\n",
      "\u001B[1;31mNameError\u001B[0m: name 'y_true' is not defined"
     ]
    }
   ],
   "source": [
    "# ROC曲线\n",
    "from sklearn.metrics import RocCurveDisplay\n",
    "from sklearn import metrics\n",
    "fpr, tpr, thresholds = metrics.roc_curve(y_true, y_pred)\n",
    "roc_auc = metrics.auc(fpr, tpr)\n",
    "display = metrics.RocCurveDisplay(fpr=fpr, tpr=tpr, roc_auc=roc_auc,\n",
    "                                  estimator_name='example estimator')\n",
    "display.plot()\n",
    "plt.show()"
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%%\n"
    }
   }
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 2
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython2",
   "version": "2.7.6"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 0
}